package com.fsy.Controller;

import com.alibaba.excel.util.DateUtils;
import com.fsy.entities.Askers;
import com.fsy.entities.Students;
import com.fsy.service.AskersService;
import com.fsy.service.StudentsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 自动分配咨询师的调度任务
 */
@Slf4j
@Component  //变成bean
@EnableScheduling  //开启定时任务的调度
public class AutoAllicationTask {

    @Resource
    private AskersService askersService;
    @Resource
    private  StudentsService studentsService;


    /**
     * 自动分配咨询师job，每隔5分钟执行一次
     */
    @Scheduled(cron = "0 0/5 * * * ? ")//任务执行时间
    public void allocationAskerJob(){
        log.info("============自动分配咨询师任务开始执行，开始时间：+" + DateUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
        //1.获取开关值，如果开关是关闭，直接结束
        String autoAllocateSwitch = ZDFPController.autoAllocateSwitch;
        if ("off".equals(autoAllocateSwitch)){
            log.info("----------分量开关已关闭，不执行自动分配，请手动分配--------");
            return;
        }

        //2.获取当天已签到的咨询师，如果无数据，直接结束
        List<Askers> askersList = askersService.findTodayCheckInAsker();
        if(askersList.size()==0){
            log.info("------------当天没有可用的已签到的咨询师，结束自动分配---------");
        }

        //3获取没有分配过咨询师的学生，如果无数据，直接结束
        List<Students> studentsList = askersService.findeNeedAllocateStudent();
        if (studentsList.size() == 0){
            log.info("----------没有待分配的学生，结束自动分配---------");
            return;
        }
        //4开始分配
        //根据分量权重依次循环分配
        //a.学生人数>咨询师人数
        //b学生人数<咨询师人数
        //c学生人数=咨询师人数
        int stuNum = studentsList.size(); //学生人数
        int askerNum = askersList.size(); //咨询师人数

        //学生人数<=咨询师人数
        if (stuNum <= askerNum){
            //只需循环一次
            for (int i = 0;i < stuNum; i++){//循环学生
                //把学生对应下标的值给相同下标的咨询师
                studentsList.get(i).setAskerId(askersList.get(i).getAskerId());
                studentsList.get(i).setZiXunName(askersList.get(i).getAskerName());
            }
        }

        //学生人数>咨询师人数
        //比如学生1，2，3，4，5，6，7，8 咨询师abc 结果a147 b258 c36
        if (stuNum > askerNum){
            //至少分配两轮
            int zhengLun = stuNum / askerNum;
            //计算整轮数
            int shengyuStuNum = stuNum % askerNum;

            //定义一个学生的下标变量
            int temp = 0;
            //循环整轮数
            for (int a = 0;a<zhengLun;a++){
                for (int i=0;i<askerNum;i++){
                    studentsList.get(temp).setAskerId(askersList.get(i).getAskerId());
                    studentsList.get(temp).setZiXunName(askersList.get(i).getAskerName());
                    temp ++;
                }
            }
            //循环剩余的学生人数
            for (int b=0;b<shengyuStuNum;b++){
                studentsList.get(temp).setAskerId(askersList.get(b).getAskerId());
                studentsList.get(temp).setZiXunName(askersList.get(b).getAskerName());
                temp ++;
            }
        }

        //所有已分配的学生状态改为2
        studentsList.forEach(students -> {
            students.setStuStatus(2);
        });

        //5提交到数据库
        boolean rsl  = studentsService.updateBatchById(studentsList);
        log.info("--------已完成自动分配，执行结果是："+ rsl + ",分配结果是："+studentsList);
        log.info("============自动分配咨询师任务结束执行，结束时间：+" + DateUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));


    }

    public static void main(String[] args) {
        System.out.println(8/3);
    }

}
